using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace HotUpdate.Editor
{
    public partial class ABTools
    {
        /// <summary>
        /// 生成AB包和对比文件。
        /// </summary>
        // [MenuItem("AB包工具/生成AB包和对比文件")]
        private void CreateABCompareFile()
        {
            string fullPath = Path.Combine(Application.dataPath, loaclPath, targetPlatform);
            // 获取文件夹信息
            DirectoryInfo directory = Directory.CreateDirectory(fullPath);

            FileInfo[] fileInfos = directory.GetFiles();

            //用于存储信息的 字符串。
            StringBuilder abCompareInfo = new StringBuilder();

            foreach (FileInfo info in fileInfos)
            {
                //没有后缀的 才是AB包 我们只想要AB包的信息
                if (info.Extension == "")
                {
                    //拼接一个AB包的信息
                    abCompareInfo.Append(info.Name);
                    abCompareInfo.Append(" ");
                    abCompareInfo.Append(info.Length);
                    abCompareInfo.Append(" ");
                    abCompareInfo.Append(GetMD5(info.FullName));
                    // 用一个分隔符分开不同文件之间的信息
                    abCompareInfo.Append(",");
                }
                //Debug.Log("**********************");
                //Debug.Log("文件名：" + info.Name);
                //Debug.Log("文件路径：" + info.FullName);
                //Debug.Log("文件后缀：" + info.Extension);
                //Debug.Log("文件大小：" + info.Length);
            }

            // 删除末尾的分隔符。
            abCompareInfo.Remove(abCompareInfo.Length - 1, 1);

            //Debug.Log(abCompareInfo);

            // 存储拼接好的 AB包资源信息
            File.WriteAllText(Path.Combine(fullPath, CompareFilefullName), abCompareInfo.ToString());
            // 刷新编辑器
            AssetDatabase.Refresh();

            Debug.Log("AB包对比文件生成成功");
        }

        /// <summary>
        /// 获取文件MD5码。
        /// </summary>
        private string GetMD5(string filePath)
        {
            //将文件以流的形式打开
            using (FileStream file = new FileStream(filePath, FileMode.Open))
            {
                //声明一个MD5对象 用于生成MD5码
                MD5 md5 = new MD5CryptoServiceProvider();
                //利用API 得到数据的MD5码 16个字节 数组
                byte[] md5Info = md5.ComputeHash(file);

                //关闭文件流
                // file.Close();

                //把16个字节转换为 16进制 拼接成字符串 为了减小md5码的长度
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < md5Info.Length; i++)
                    sb.Append(md5Info[i].ToString("x2"));

                return sb.ToString();
            }
        }
    }
}